跳到主要内容

树莓派GPIO控制

树莓派GPIO控制

一、常用开源工程简介

树莓派内核中已经编译自带了gpio的驱动,我们常通过一些第三方写好的库函数来完成具体的操作,比较常见的操作库函数有:

1、python GPIO

【开发语言】——python

【简单介绍】——树莓派官方资料中推荐且容易上手。python GPIO是一个小型的python库,可以帮助用户完成raspberry相关IO口操作,但是python GPIO库还没有支持SPI、I2C或者1-wire等总线接口。

【官方网站】——

2、wiringPi

【开发语言】——C语言

【简单介绍】——wiringPi适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi的API函数和arduino非常相似,这也使得它广受欢迎。作者给出了大量的说明和示例代码,这些示例代码也包括UART设备,I2C设备和SPI设备等。

【官方网站】——

3、BCM2835 C Library

【开发语言】——C语言

【简单介绍】BCM2835 C Library可以理解为使用C语言实现的相关底层驱动,BCM2835 C Library的驱动库包括GPIO、SPI和UART等,可以通过学习BCM2835 C Library熟悉BCM2835相关的寄存器操作。如果有机会开发树莓派上的linux驱动,或自主开发python或PHP扩展驱动,可以从BCM2835 C Library找到不少的“灵感”。

【官方网站】—— 二、树莓派GPIO编号方式

1、功能物理引脚:**

从左到右,从上到下:左边基数,右边偶数:1-40

2、BCM:

编号侧重CPU寄存器,根据BCM2835的GPIO寄存器编号。

3、wpi:

编号侧重实现逻辑,把扩展GPIO端口从0开始编号,这种编号方便编程。正如图3 WiringPi一栏。

http:/ter

三、python GPIO

1、先安装python-dev,输入以下指令。

sudo apt-get install python-dev

**

**

2、安装RPi.GPIO,依次输入以下指令。

1下载:$ wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz

2解压缩:$ tar xvzf RPi.GPIO-0.5.3a.tar.gz

3进入解压之后的目录 :$ cd RPi.GPIO-0.5.3a 4启动安装 :$ sudo python setup.py install

3、例子:

1. \# -\*- coding: utf-8 -\*-  

2. **import** RPi.GPIO as GPIO

3. **import** time

4. \# BOARD编号方式,基于插座引脚编号

5. GPIO.setmode(GPIO.BOARD)

6. \# 输出模式

7. GPIO.setup(11, GPIO.OUT)

8.

9. **while** True:

10. GPIO.output(11, GPIO.HIGH)

11. time.sleep(1)

12. GPIO.output(11, GPIO.LOW)

13. time.sleep(1)

4、执行: sudo python led.py

5、说明: 1)GPIO.setmode(GPIO.BOARD),采用插座引脚编号方式。 2)由于采用插座引脚编号方式,此处的11脚相当于BCM2835寄存器编号方式的引脚11。

四、python GPIO 1、说明: WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3。wiringPi使用C或者C++开发并且可以被其他语言包转,例如python、ruby或者PHP等。 wiringPi包括一套gpio控制命令,使用gpio命令可以控制树莓派GPIO管脚。用户可以利用gpio命令通过shell脚本控制或查询GPIO管脚。wiringPi是可以扩展的,可以利用wiringPi的内部模块扩展模拟量输入芯片,可以使用MCP23x17/MCP23x08(I2C 或者SPI)扩展GPIO接口。另外可通过树莓派上的串口和Atmega(例如arduino等)扩展更多的GPIO功能。另外,用户可以自己编写扩展模块并把自定义的扩展模块集成到wiringPi中。WiringPi支持模拟量的读取和设置功能,不过在树莓派上并没有模拟量设备。但是使用WiringPi中的软件模块却可以轻松地应用AD或DA芯片。

2.wiringPi安装

1方案A——使用GIT工具

通过GIT获得wiringPi的源代码

git clone git://git.drogon.net/wiringPi cd wiringPi

./build

build脚本会帮助你编译和安装wiringPi

2方案B——直接下载 我们可以在https://git.drogon.net/?p=wiringPi;a=summary网站上直接下载最新版本编译使用

tar xfz wiringPi-xx.tar.gz

cd wiringPi-xx

./build

3、测试:

wiringPi包括一套gpio命令,使用gpio命令可以控制树莓派上的各种接口,通过以下指令可以测试wiringPi是否安装成功。 $gpio -v gpio readall 即可出现上面的io图

4、例子:

1. \#include \<wiringPi.h\>  

2. **int** main(**void**)

3. {

4. wiringPiSetup() ;

5. pinMode (0, OUTPUT) ;

6. **for**(;;)

7. {

8. digitalWrite(0, HIGH) ; delay (500) ;

9. digitalWrite(0, LOW) ; delay (500) ;

10. }

11. }
 **5、编译运行:**
在树莓派上:
gcc -Wall -o test test.c -lwiringPi
sudo ./test

在虚拟机中:
am-linux-gcc -Wall -o test test.c -lwiringPi
sudo ./test

6、注意事项: 1)IO的编号方式略有不同,采用wiring编码方式。 2)-lwiringPi表示动态加载wiringPi共享库。

五、BCM2835 C Library

1、下载: $ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.35.tar.gz

2、解压缩: $tar xvzf bcm2835-1.35.tar.gz 3、进入压缩之后的目录:$cd bcm2835-1.35 4、 配置: $./configure 5、从源代码生成安装包:$make 6、执行检查: $sudo make check 7、安装 bcm2835库: $sudo make install

8、例子

1. \#include \<bcm2835.h\>  

2.

3. // P1插座第11脚

4. \#define PIN RPI\_GPIO\_P1\_11

5.

6. **int** main(**int** argc, **char** \*\*argv)

7. {

8. **if** (!bcm2835\_init())

9. **return** 1;

10.

11. // 输出方式

12. bcm2835\_gpio\_fsel(PIN, BCM2835\_GPIO\_FSEL\_OUTP);

13.

14. **while** (1)

15. {

16. bcm2835\_gpio\_write(PIN, HIGH);

17. bcm2835\_delay(100);

18.

19. bcm2835\_gpio\_write(PIN, LOW);

20. bcm2835\_delay(100);

21. }

22. bcm2835\_close();

23. **return** 0;

24. }

9、注意事项: 1)IO的编号方式略有不同,采用wiring编码方式。 2)-lwiringPi表示动态加载wiringPi共享库。**


[树莓派开发系列教程10——树莓派spi液晶屏支持(fbtft)](http://blog.csdn.net/xdw1985829/article/details/39583239)** ****树莓派官方支持****av****及****HDMI****输出,板子上预留了一个****csi****接口的液晶显示屏,但是一直没有相应的模组出现。在很多应用场合我们需要一些小型的液晶屏显示一些基本的信息,所以小屏驱动很是必要。****

**** ****在****github****上有一个开源工程:****notro/fbtft****,完整的实现了****framebuffer****驱动,让树莓派完美支持****tft****液晶,下面对移植过程进行一个简单说明****

****一、官网地址****

****工程首页:****https://github.com/notro****

****fbtft****源码:****https://github.com/notro/fbtft****

****编译好的固件(基于****3.12.25+****)****:https://github.com/notro/rpi-firmware****

****使用说明****(wiki)****:****https://github.com/notro/fbtft/wiki**

**二、使用编译好的固件****(3.12.25+)**

环境:树莓派

https://github.com/notro/rpi-firmware

**1****、打开****SPI**

树莓派默认spi是关掉的,我们需要打开

sudo vi /etc/modprobe.d/raspi-blacklist.conf

把下面这句话前面的\#号删掉

blacklist spi-bcm2708

**2****、下载:**

1)以模块的形式编译进内核(需要手动或脚本加载模块)3.12.25+(**试验成功**)
sudo REPO\_URI=https://github.com/notro/rpi-firmware rpi-update

2)直接编译进内核(**笔者没有试验**)
sudo REPO\_URI=https://github.com/notro/rpi-firmware BRANCH=builtin rpi-update

3)以模块的形式编译进内核(**需要手动或脚本加载模块,最新版本,笔者试过启动不起来,不知道哪出问题**)

sudo REPO\_URI=https://github.com/notro/rpi-firmware BRANCH=latest rpi-update

4)直接下载压缩包,手动安装(**适合树莓派不能联网的时候**)

http://tronnes.org/downloads/2014-06-20-wheezy-raspbian-2014-07-25-fbtft-master-firmware.zip

**3****、配置**

**1)****手动加载模块:**

sudo modprobe fbtft\_device name=adafruit22

name后面的名字,要跟相应的液晶驱动芯片移植

笔者使用的液晶芯片为:**fb\_ra8875****,所以这里写的是:****er\_tftm050\_2**

其它芯片请查阅:https://github.com/notro/fbtft/blob/master/fbtft\_device.c 文件

正常会提示以下信息

fbtft\_device: SPI devices registered:
fbtft\_device: spidev spi0.0 500kHz 8 bits mode=0x00
fbtft\_device: spidev spi0.1 500kHz 8 bits mode=0x00
fbtft\_device: 'fb' Platform devices registered:
fbtft\_device: bcm2708\_fb id=-1 pdata? no
fbtft\_device: Deleting spi0.0
fbtft\_device: GPIOS used by 'adafruit22':
fbtft\_device: 'reset' = GPIO25
fbtft\_device: 'led' = GPIO23
fbtft\_device: SPI devices registered:
fbtft\_device: spidev spi0.1 500kHz 8 bits mode=0x00
fbtft\_device: fb\_hx8340bn spi0.0 32000kHz 8 bits mode=0x00

graphics fb1: fb\_hx8340bn frame buffer, 176x220, 75 KiB video memory, 16 KiB buffer memory, fps=20, spi0.0 at 32 MHz

**在****/dev/****目录下出现****: /dev/fb1****设备**

**2****)自动加载模块**

sudo vi /etc/modules

加入以下语句,既可以在启动时自动加载模块

spi-bcm2708

fbtft\_device name=er\_tftm050\_2 **speed=28000000 fps=25** verbose=0

红色部分根据实际情况调整,可能出现花屏现象

**4****、使用(官方给出的方法,笔者测试不成功)**

**1)****手动启动****x11****和控制台到新的液晶屏**
X Windows显示在fb1上:
$FRAMEBUFFER=/dev/fb1 startx

Console显示在fb1上:
$con2fbmap 1 1

**2)****自动登陆****x11**

**sudo vi /etc/inittab**
\#1:2345:respawn:/sbin/getty --noclear 38400 tty1
1:2345:respawn:/bin/login -f pi tty1 \</dev/tty1 \>/dev/tty1 2\>&1

**sudo vi /etc/rc.local**

su -l pi -c "env FRAMEBUFFER=/dev/fb1 startx &"
**
****5****、使用(笔者使用这个测试通过)**

**1)****将****fb0****上的内容直接拷贝到****fb1****上****,fb0****和****fb1****同步**

**https://github.com/notro/fbtft/wiki/Framebuffer-use\#framebuffer-mirroring**

$git clone https://github.com/tasanakorn/rpi-fbcp

$cd rpi-fbcp/
$mkdir build
$cd build/
$cmake ..
$make
$sudo install fbcp /usr/local/bin/fbcp

**启动**:fbcp &

**关闭****fbcp**:killall fbcp

**2)****启动时使用****fb1**

$sudo apt-get install xserver-xorg-video-fbdev

$sudo vi /usr/share/X11/xorg.conf.d/99-fbdev.conf

加入以下语句:

Section "Device"
Identifier "myfb"
Driver "fbdev"
Option "fbdev" "/dev/fb1"
EndSection

**启动:**startx

**测试:**

apt-get -y install fbi

fbi -d /dev/fb1 -T 1 -noverbose -a test.jpg

**三、由内核及源码编译**

**1****、下载、编译内核源码:**

**请见《**[**树莓派开发系列教程****8——****树莓派内核编译与固件升级**](http://blog.csdn.net/xdw1985829/article/details/39077611)**》**

**2****、下载、编译****fbtft****源码**

**$cd linux****(****进入下载好的内核源码目录****)**

**$cd drivers/video**

**$git clone https://github.com/notro/fbtft.git****(下载****fbtft****源码,也可以在别的地方下载好,拷贝过来)**

**

** ****修改内核源码的****Kconfig****及****Makefine**

** Add to drivers/video/Kconfig: source "drivers/video/fbtft/Kconfig"**

** Add to drivers/video/Makefile: obj-y += fbtft/**

**$make menuconfig(****在配置界面加入所选用液晶的驱动支持****)**

**[plain]** [view plain](http://blog.csdn.net/xdw1985829/article/details/39583239 "view plain")[copy](http://blog.csdn.net/xdw1985829/article/details/39583239 "copy")

1. Device Drivers ---\>

2. Graphics support ---\>

3. \<M\> Support for small TFT LCD display modules ---\>

4.

5. \<M\> FB driver for the HX8353D LCD Controller

6. \<M\> FB driver for the ILI9320 LCD Controller

7. \<M\> FB driver for the ILI9325 LCD Controller

8. \<M\> FB driver for the ILI9340 LCD Controller

9. \<M\> FB driver for the ILI9341 LCD Controller

10. \< \> FB driver for the ILI9481 LCD Controller

11. \<M\> FB driver for the ILI9486 LCD Controller

12. \<M\> FB driver for the PCD8544 LCD Controller

13. \<M\> FB driver for the RA8875 LCD Controller

$make